import axios from 'axios';
import winston from 'winston';

// 配置日志记录器
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  transports: [
    new winston.transports.Console({
      format: winston.format.simple()
    }),
    new winston.transports.File({ filename: 'logs/deepseek_api.log' })
  ]
});

/**
 * 调用DeepSeek API进行AI分析
 * @param {Object} payload - 请求数据
 * @param {string} payload.model - 模型名称，默认为 deepseek-chat
 * @param {Array} payload.messages - 消息列表
 * @param {number} payload.max_tokens - 最大token数
 * @param {number} payload.temperature - 温度参数
 * @returns {Promise<Object>} - API响应结果
 */
export const callDeepSeekAPI = async (payload = {}) => {
  try {
    const apiKey = process.env.DEEPSEEK_API_KEY;
    const apiUrl = process.env.DEEPSEEK_API_URL || 'https://api.deepseek.com/v1/chat/completions';

    if (!apiKey) {
      throw new Error('DeepSeek API密钥未配置');
    }

    // 默认参数
    const defaultPayload = {
      model: 'deepseek-chat',
      messages: [
        {
          role: 'system',
          content: '你是一个专业的医疗AI助手，专门帮助分析溃疡性结肠炎内镜图像。'
        }
      ],
      max_tokens: 2000,
      temperature: 0.1,
      stream: false
    };

    // 合并用户参数
    const requestPayload = {
      ...defaultPayload,
      ...payload,
      messages: [
        defaultPayload.messages[0],
        ...(payload.messages || [])
      ]
    };

    logger.info('开始调用DeepSeek API', {
      model: requestPayload.model,
      messageCount: requestPayload.messages.length
    });

    const response = await axios.post(apiUrl, requestPayload, {
      headers: {
        'Authorization': `Bearer ${apiKey}`,
        'Content-Type': 'application/json'
      },
      timeout: 60000 // 60秒超时
    });

    logger.info('DeepSeek API调用成功', {
      status: response.status,
      usage: response.data.usage
    });

    return response.data;

  } catch (error) {
    logger.error('DeepSeek API调用失败', {
      error: error.message,
      response: error.response?.data
    });

    if (error.response?.status === 401) {
      throw new Error('API密钥无效或已过期');
    } else if (error.response?.status === 429) {
      throw new Error('API调用频率超限，请稍后重试');
    } else if (error.code === 'ECONNABORTED') {
      throw new Error('请求超时，请检查网络连接');
    } else {
      throw new Error(`DeepSeek API调用失败: ${error.message}`);
    }
  }
};

/**
 * 分析UCEIS评分结果
 * @param {number} uceisScore - UCEIS评分
 * @param {Object} imageAnalysis - 图像分析结果
 * @returns {Promise<Object>} - AI分析结果
 */
export const analyzeUCEISWithDeepSeek = async (uceisScore, imageAnalysis = {}) => {
  const prompt = `
请根据以下UCEIS评分结果，提供详细的医疗分析：

UCEIS评分：${uceisScore}分
图像分析：${JSON.stringify(imageAnalysis, null, 2)}

请提供：
1. 严重程度评估（缓解期/轻度/中度/重度）
2. 详细的分析说明
3. 治疗建议（如果需要）
4. 随访建议

请以JSON格式返回结果，包含以下字段：
- severity: 严重程度（文字描述）
- analysis: 详细分析说明
- recommendations: 治疗建议
- followUp: 随访建议
- confidence: 评估置信度（0-1之间）
`;

  try {
    const response = await callDeepSeekAPI({
      messages: [
        {
          role: 'user',
          content: prompt
        }
      ],
      temperature: 0.1,
      max_tokens: 1500
    });

    // 尝试解析返回的JSON
    const content = response.choices[0].message.content;
    let parsedResult;

    try {
      // 提取JSON部分
      const jsonMatch = content.match(/\{[\s\S]*\}/);
      if (jsonMatch) {
        parsedResult = JSON.parse(jsonMatch[0]);
      } else {
        // 如果无法解析JSON，创建默认格式
        parsedResult = {
          severity: uceisScore <= 1 ? '缓解期' : uceisScore <= 3 ? '轻度' : uceisScore <= 6 ? '中度' : '重度',
          analysis: content,
          recommendations: '请咨询主治医生获取具体治疗建议',
          followUp: '建议定期随访复查',
          confidence: 0.85
        };
      }
    } catch (parseError) {
      logger.warn('解析DeepSeek返回的JSON失败，使用默认格式', { error: parseError.message });
      parsedResult = {
        severity: uceisScore <= 1 ? '缓解期' : uceisScore <= 3 ? '轻度' : uceisScore <= 6 ? '中度' : '重度',
        analysis: content,
        recommendations: '请咨询主治医生获取具体治疗建议',
        followUp: '建议定期随访复查',
        confidence: 0.85
      };
    }

    return {
      success: true,
      data: parsedResult,
      rawResponse: response
    };

  } catch (error) {
    logger.error('使用DeepSeek分析UCEIS失败', { error: error.message });
    throw error;
  }
};

export default {
  callDeepSeekAPI,
  analyzeUCEISWithDeepSeek
};